Aula 26 - Pivoteando dados

Módulo 3: Apresentando suas análises

Carolina Musso

PROFESP, DEMSP, MS

Esta semana

Aula 25 - A gramática dos gráficos

Reintrodução ao ggplot e tipos de gráficos

Aula 26 - Pivoteamento de dados

pivot_wider(), pivot_longer(), qual é melhor para o ggplot

Aula 27 - Formatações para ggplot

Paleta de cores, temas, e outras firulas

Leituras para aprofundamento

Messy data

“Tidy datasets are all alike, but every messy dataset is messy in its own way.” –– Hadley Wickham

“Base de dados arrumadas são todas iguais, mas bases desorganizadas, são desorganizadas em sua própria maneira”

Pacote tidy

  • Deixar o data frame no formato ideal.

Leituras de aprofundamento

Formato largo (wide)

  • É bom pra tabelas, mas não é bom pra para o ggplot…

    • vamos transformar para longo

Formato longo (long)

  • É bom para o ggplot, mas não para apresentar em tabela!

    • vamos transformar para wide

Wide X Long: aplicações

  • Tomemos esse gráfico
ggplot(dado_malaria ) +
  geom_col(aes(x = data_date, y = Total), width = 1)

Vamos supor que eu queria colorir segundo a faixa-etária.

head(dado_malaria)
  location_name  data_date faixa_0_04 faixa_5_14 faixa_15_mais Total
1    Facility 1 2020-08-11         11         12            23    46
2    Facility 1 2020-08-10         11          4             5    20
3    Facility 1 2020-08-09         18          4            84   106
4    Facility 1 2020-08-04         16          7            20    43
5    Facility 1 2020-08-03         12          9            15    36
6    Facility 1 2020-08-02         14         13            12    39
  • Qual o problema?

Necessário primeiro transformar para formato longo

dado_malaria_longo <- dado_malaria  %>% 
  pivot_longer(
    cols = c(`faixa_0_04`, `faixa_5_14`, `faixa_15_mais`)
  )
# Usar a função auxiliar starts_with
dado_malaria_longo <-dado_malaria %>% 
  pivot_longer(
    cols = starts_with("faixa_")
  )

O que mudou

  • Quais novas colunas apareceram no banco? E quais sumiram?
head(dado_malaria_longo)
# A tibble: 6 × 5
  location_name data_date  Total name          value
  <chr>         <date>     <int> <chr>         <int>
1 Facility 1    2020-08-11    46 faixa_0_04       11
2 Facility 1    2020-08-11    46 faixa_5_14       12
3 Facility 1    2020-08-11    46 faixa_15_mais    23
4 Facility 1    2020-08-10    20 faixa_0_04       11
5 Facility 1    2020-08-10    20 faixa_5_14        4
6 Facility 1    2020-08-10    20 faixa_15_mais     5
  • As colunas originais desapareceram, e foram comprimidas em duas colunas chamadas “names” e “values”.

Ainda outra opção

  • Podemos ainda especificar o nome das novas colunas que surgião no banco
dado_malaria_longo <- 
  dado_malaria %>% 
  pivot_longer(
    cols = starts_with("faixa_"),
    names_to = "Faixa-etária",
    values_to = "Contagens"
  )

Agora ao gráfico!

  • Agora podemos fazer o gráfico como queríamos, colorindo as barras segundo a faixa-etária
ggplot(data = dado_malaria_longo) +
  geom_col(
    mapping = aes(x = data_date, y = Contagens, fill = `Faixa-etária`)
  )

O caso oposto

  • Outra base

  • Faixa-etária x Sexo

ggplot(dado_ebola) +
  geom_col(aes(x = age_cat, y = n, fill = gender))

head(dado_ebola)
  age_cat gender   n
1     0-4      f 640
2     0-4      m 416
3     0-4   <NA>  39
4     5-9      f 641
5     5-9      m 412
6     5-9   <NA>  42
  • Agora está bom para um gráfico mas está muito comprida para fazer uma tabela, não é mesmo?

Transformando o longo em largo

dado_ebola_largo <- 
  dado_ebola %>% 
  pivot_wider(
    id_cols = age_cat,
    names_from = gender,
    values_from = n
  )
head(dado_ebola_largo )
# A tibble: 6 × 4
  age_cat     f     m  `NA`
  <fct>   <int> <int> <int>
1 0-4       640   416    39
2 5-9       641   412    42
3 10-14     518   383    40
4 15-19     359   364    20
5 20-29     468   575    30
6 30-49     179   557    18

Obrigada!